package Day_0130;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author zxc
 * @date 2023/01/30 20:08
 **/
public class JavaCreateObject {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        // 以 类名.class的方式来创建Class对象;
        Class<person> personClass = person.class;
        // 通过Class对象，来创建一个Person对象实例;
        person person = personClass.newInstance();
        // 通过Class对象，来获取声明字段;
        Field name = personClass.getDeclaredField("name");
        // 若是获取的该字段为private的话，即需要将其设置为public;
        name.setAccessible(true);
        name.set(person , "zxc");
        // 通过Class对象，来获取声明方法;
        Method sayHello = personClass.getDeclaredMethod("sayHello", Integer.class);
        // 若是获取的该方法为private的话，即需要将其设置为public;
        sayHello.setAccessible(true);
        // 调用方法
        sayHello.invoke(person , 18);

        /**
         * java中提供了以下四种创建对象的方式:
         * （1）new创建新对象;
         * （2）通过反射机制;
         * （3）采用clone机制;
         * （4）通过序列化机制;
         */
    }

}
class person{
    private String name;
    private void sayHello(Integer age){
        System.out.println(name + " " + age);
    }
}
